package com.study.modules.designPatterns.No06ObserverMode;

/**
 * 观察者模式
 * 观察者模式（Observer Pattern）定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
 * 观察者模式属于行为型模式。
 * 观察者模式的主要优点如下：
 * 1、观察者模式将观察者和被观察者分离。
 * 2、观察者模式将更新封装在了观察者对象中，而不是被观察者对象中。
 * 3、观察者模式支持广播通信。
 *
 * 观察者模式的主要缺点如下：
 * 1、观察者模式将观察者和被观察者耦合在一起，一个被观察者对象如果需要增加新的观察者对象就不得不修改源代码，而且如果观察者对象需要删除，则需要循环所有观察者对象。
 * 2、观察者模式没有相应的机制让观察者知道所观察的目标对象是，如果要做通知，则需要每一个观察者对象都要将自己作为参数传入，这会增加程序的复杂性。
 * 3、当观察者对象有很多时，观察者和被观察者之间的通信会非常复杂。
 */
public class TestObserverMode {

    public static void main(String[] args) {
        // 创建被观察者
        WeatherSubject weatherSubject = new WeatherSubject();

        // 创建云观察者
        CloudObserver cloudObserver = new CloudObserver(weatherSubject);
        // 将云观察者添加到被观察者
        weatherSubject.attach(cloudObserver);

        // 创建彩虹观察者
        RainbowObserver rainbowObserver = new RainbowObserver(weatherSubject);
        // 将彩虹观察者添加到被观察者
        weatherSubject.attach(rainbowObserver);

        // 模拟天气变化
        weatherSubject.changeWeather("晴天");
        weatherSubject.changeWeather("雨天");
    }

}
